<?php 
/**
 * Benchmark 
 * 方法1：ab -n 100000 -c200 127.0.0.1:56789/
 * 方法2：使用workerman自带的benchmark软件，只支持64位linux系统
 * ①：./benchmark -n10000 -h1 -c400 -p56789 127.0.0.1    // 命令含义是400并发线程，连接127.0.0.1:56789端口发送一个hello\n扥带服务端返回一个hello\n后断开连接，这样运行10000次
 * ②：./benchmark -n1 -h10000 -c1000 -p56789 127.0.0.1    // 命令含义是1000并发线程，连接127.0.0.1:56789端口连续发送10000个hello\n
 * @author walkor <workerman.net>
 */
class Benchmark extends Man\Core\SocketWorker
{
    /**
     * @see Worker::dealInput()
     */
    public function dealInput($buffer)
    {
       // 由于请求包都小于一个MTU，不会有分包，这里直接返回0
       return 0;
    }
    
    /**
     * 处理业务
     * @see Worker::dealProcess()
     */
    public function dealProcess($buffer)
    {
        // 是HTTP协议
        if('G' == $buffer[0] )
        {
            $length = strlen($buffer);
            $this->sendToClient("HTTP/1.1 200 OK\r\nContent-Length: ".$length."\r\n\r\nhello");
            return $this->closeClient($this->currentDealFd);
        }
        // 是benchmark脚本
        switch ($buffer){
            case 1:
                $response = "按键1是代表啥意思？";
                break;
            case 2:
                $response = "按键2是代表我想你！";
                //$response = 
                break;
            case 3:
                $arr=array("action"=>"get_first","data"=>1);
                $buffer = json_encode($arr);
                // 包的整体长度为json长度加首部四个字节(首部数据包长度存储占用空间)
                $total_length = 4 + strlen($buffer);
                $response= pack('N', $total_length) . $buffer;
                break;
            default :
                $buffer_data = unpack('Ntotal_length', $buffer);
                // 得到这次数据的整体长度（字节）
                $total_length = $buffer_data['total_length'];
                // json的数据
                $json_string = substr($buffer, 4);
                $buffer_1 = json_encode($json_string);
                $total_length = 4 + strlen($buffer_1);
                $response= pack('N', $total_length) . $buffer_1;
                break;
                
        }
        
        $result= $this->sendToClient($response);
        return $result;
    }
    
} 
